第3章 进程管理
3.1 进程
进程是处于执行期的程序以及相关资源的总称,是正在执行的程序代码的实时结果。除了可执行程序代码外,进程还包含了其它资源:
- 打开的文件
- 挂起的信号
- 内核内部数据
- 处理器状态
- 一个或多个具有内存映射的内存地址空间及一个或多个执行线程
- 存放全局变量的数据段
线程是在进程中活动的对象,每个线程拥有:
- 一个独立的程序计数器
- 进程栈
- 一组进程寄存器
内核调度的对象是线程,不是进程。
传统的Unix系统中一个进程只包含一个线程;对Linux系统而言,线程只不过是一种特殊的进程。
现代操作系统的进程提供两种虚拟机制:
- 虚拟存储器:让进程觉得自己独享处理器
- 虚拟内存:让进程觉得自己拥有整个系统的内存资源
Linux系统中通常通过fork()系统调用创建进程,调用fork的进程称为父进程,新生的进程称为子进程。fork系统调用从内核返回两次:一次回到父进程,另一次回到新产生的子进程。
程序通过exit()系统调用退出执行,这个函数会终结进程并将其占用的资源释放掉。
父进程可以通过wait4()系统调用查询子进程是否终结。
进程退出执行后被设置为僵死状态,直到它的父进程调用wait()或waitpid()为止。
3.2 进程描述符及任务结构
内核把进程的列表存放在任务队列(task list,双向循环列表),列表成员都是类型为task_struct的结构体,称为进程描述符(process descriptor),进程描述符包含一个具体进程的所有信息。